/**
 * \file wSelectionContours.h
 * \author Florian LANCE - Armand POLI
 * \version 1.0
 * \date octobre 2011
 */

#ifndef WISELECTIONCONTOURS_H
#define WISELECTIONCONTOURS_H

#include <QLabel>
#include <QPoint>
#include <QPainter>
#include <QGridLayout>
#include <QPixmap>

#include <iostream>
#include "Point.h"
#include <complex>

typedef unsigned int uint;
typedef std::complex<double> cx;
typedef std::vector<std::complex<double> > tab_cx;

/**
* @class Classe wISelectionContours qui hérite de QWidget, permet de créer et d'afficher un contour sur une image.
*/
class wISelectionContours : public QWidget
{
    Q_OBJECT

    public:

        /** @brief Constructeur par défaut de wISelectionContours. */
        wISelectionContours();
        ~wISelectionContours();

        /** @brief Récupère le point de contour numéro i. */
        Point getTab(const uint i);
        /** @brief Récupère un tableau contenant tous les points du contour. */
        std::vector<Point> tab();

        /** @brief Modifie l'image du widget à partir d'un QPixmap. */
        void setPixmap(const QPixmap& img);
        /** @brief Modifie le nombre de point du contour. */
        void setNbPoints(const int nbPts);
        /** @brief Rempli tabPoints à partir d'un tableau de complexes. */
        void setTab(const tab_cx& tab);
        /** @brief Rempli tabPointsFiltre à partir d'un tableau de complexes. */
        void setTabFiltre(const tab_cx& tab);

    protected:

        void mouseReleaseEvent(QMouseEvent*);
        void paintEvent(QPaintEvent *);
        void keyPressEvent(QKeyEvent *);

    private:

        std::vector<QPoint> tabPoints;       /**< Tableau de QPoint contenant les valeurs du contour. */
        std::vector<QPoint> tabPointsFiltre; /**< Tableau de QPoint contenant les valeurs du contour filtré. */
        QPixmap img;                         /**< Image du widget. */
        QGridLayout layoutImage;             /**< Layout par grille du widget. */
        QLabel labelImage;                   /**< Label contenant l'image du widget. */
        uint nbPtsContours;                  /**< Entier positif contenant le nombre de points du contour. */


    signals:
        /** @brief Signal indiquant qu'un click a été effectué sur le widget. */
        void clicked();
        /** @brief Signal indiquant qu'une touche à été pressée sur le widget. */
        void KPressed();

    public slots:
        /** @brief Slot permettant d'ajouter un nouveau point dans le contour après un click. */
        void ajouterPointTab();
        /** @brief Slot permettant de modifier le nombre maximum de points. */
        void modifMax();

};


#endif // WISELECTIONCONTOURS_H
